package com.engine.salary.formlua.func.finance;

import com.engine.salary.formlua.entity.parameter.DataType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
public class FinanceServiceImpl implements FinanceService{
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Override
    public DataType getMoney(Object... objects) {
        DataType moneyDataType=new DataType();
        moneyDataType.setDataType(DataType.STRING);
        moneyDataType.setContent("");
        if(objects!=null && objects.length>0){
            String money=null;
            if(objects[0] instanceof DataType){
                DataType dataType=(DataType)objects[0];
                money=dataType.getContent()==null?null:dataType.getContent().toString();
            }else{
                if(objects[0]!=null){
                    money=objects[0].toString();
                }
            }
            moneyDataType=convertCurrency(money);
        }
        return moneyDataType;
    }
    public DataType convertCurrency(String param) {
        // 汉字的数字
        String[] cnNums = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        // 基本单位
        String[] cnIntRadice = new String[]{"", "拾", "佰", "仟"};
        // 对应整数部分扩展单位
        String[] cnIntUnits = new String[]{"", "万", "亿", "兆"};
        // 对应小数部分单位
        String[] cnDecUnits = new String[]{"角", "分", "毫", "厘"};
        // 整数金额时后面跟的字符
        String cnInteger = "整";
        // 整型完以后的单位
        String cnIntLast = "元";
        // 最大处理的数字
        BigDecimal maxNum = new BigDecimal(999999999999999.9999);
        // 金额整数部分
        String integerNum;
        // 金额小数部分
        String decimalNum;
        // 输出的中文金额字符串
        String chineseStr = "";
        // 分离金额后用的数组，预定义
        String[] parts;
        BigDecimal money=null;
        if (param == null || param.equalsIgnoreCase("")) {
            return new DataType(DataType.STRING,"");
        }
        money = new BigDecimal(param);
        if (money.compareTo(maxNum)==0) {
            // 超出最大处理数字
            return new DataType(DataType.STRING,"");
        }
        if (money.intValue() == 0) {
            chineseStr = cnNums[0] + cnIntLast + cnInteger;
            return new DataType(DataType.STRING,chineseStr);
        }
        // 转换为字符串
        //如果是整数
        if (param.indexOf('.') == -1) {
            integerNum = money.intValue()+"";
            decimalNum = "";
            //如果存在小数
        } else {
            parts = param.split("\\.");
            integerNum = parts[0];
            decimalNum = parts[1];
        }
        // 获取整型部分转换
        if (integerNum.length() > 0) {
            int zeroCount = 0;
            int intLen = integerNum.length();
            for (int i = 0; i < intLen; i++) {
                String n = integerNum.substring(i, i+1);
                int p = intLen - i - 1;
                int q = p / 4;
                int m = p % 4;
                if (n.equals("0")) {
                    zeroCount++;
                } else {
                    if (zeroCount > 0) {
                        chineseStr += cnNums[0];
                    }
                    // 归零
                    zeroCount = 0;
                    chineseStr += cnNums[Integer.parseInt(n)] + cnIntRadice[m];
                }
                if (m == 0 && zeroCount < 4) {
                    chineseStr += cnIntUnits[q];
                }
            }
            chineseStr += cnIntLast;
        }
        // 小数部分
        if (!decimalNum.equals("")) {
            int decLen = decimalNum.length();
            for (int i = 0; i < decLen; i++) {
                String n = decimalNum.substring(i, i+1);
                if (!n.equals("0")) {
                    chineseStr += cnNums[Integer.parseInt(n)] + cnDecUnits[i];
                }
            }
        }
        if (chineseStr.equals("")) {
            chineseStr += cnNums[0] + cnIntLast + cnInteger;
        } else if (decimalNum.equals("")) {
            chineseStr += cnInteger;
        }
        return new DataType(DataType.STRING,chineseStr);
    }
}
